﻿#pragma once
/*
 通⽤功能类，与业务⽆关的功能实现
 1. 获取系统时间
 2. 获取⽂件⼤⼩
 3. 创建⽬录
 4. 获取⽂件所在⽬录
*/
#include <iostream>
#include <filesystem>
#include <chrono>
#include <format>
#include <string>
#include <ctime>
#include <sys/stat.h>

//命名空间重命名->用于命名空间简写
namespace fs = std::filesystem;

namespace Local_Log
{
	namespace Util
	{
		class Log_Date
		{
		private:
			enum TimeFormat
			{
				DATETIME = 1,
				DATE,
				TIME
			};
			static void _timeformat(std::string& datetime, int format)
			{
				datetime.clear();
				auto now = std::chrono::system_clock::now();
				// 转换为本地时间（自动处理时区）
				auto local_time = std::chrono::current_zone()->to_local(now);
				// 格式化输出（完整中文格式）
				switch (format)
				{
				case TimeFormat::DATETIME:
					datetime = std::format("[{:%Y-%m-%d}]""[{:%H:%M:%S}]", local_time, local_time);
					datetime.erase(20, 8);
					return;
				case TimeFormat::DATE:
					datetime = std::format("[{:%Y-%m-%d}]", local_time);
					return;
				case TimeFormat::TIME:
					datetime = std::format("[{:%H:%M:%S}]", local_time);
					datetime.erase(9, 8);
					return;
				}

			}
		public:
			//获取系统时间-输出时间戳
			static time_t Now()
			{
				return time(nullptr);
			}
			//获取系统时间-输出DATA-TIME
			static std::string Now_datetime()
			{
				std::string lo_now;
				_timeformat(lo_now, TimeFormat::DATETIME);
				return lo_now;
			}
			//获取系统时间-输出DATA
			static std::string Now_date()
			{
				std::string lo_now;
				_timeformat(lo_now, TimeFormat::DATE);
				return lo_now;
			}
			//获取系统时间-输出TIME
			static std::string Now_time()
			{
				std::string lo_now;
				_timeformat(lo_now, TimeFormat::TIME);
				return lo_now;
			}
			//单独获取 年 月 日 时 分 秒 的类
			/*	std::cout << "当前时间（2025-10-28 17:02）：\n"
					<< "年: " << lo_time.tm_year + 1900 << "\n"  // 2025
					<< "月: " << lo_time.tm_mon + 1 << "\n"      // 10
					<< "日: " << lo_time.tm_mday << "\n"         // 28
					<< "时: " << lo_time.tm_hour << "\n"         // 17
					<< "分: " << lo_time.tm_min << "\n"          // 2
					<< "秒: " << lo_time.tm_sec;                 // 当前秒数 */
			static std::tm  GetTm()
			{
				std::time_t lo_now = std::time(nullptr);
				// 线程安全转换（Windows用localtime_s，Linux用localtime_r）
				std::tm lo_time;
#ifdef _WIN32 
				localtime_s(&lo_time, &lo_now);
#else 
				localtime_r(&lo_now, &lo_time);
#endif 
				lo_time.tm_year += 1900;
				lo_time.tm_mon += 1;
				return lo_time;
			}
		private:
		};
		//检测文件是否存在
		//获取⽂件所在⽬录
		//创建⽬录
		class Log_File
		{
		public:
			//检测文件是否存在 exists 存在
			static bool Exists(const std::string& pathname)
			{
				struct stat lo_st;
				return stat(pathname.c_str(), &lo_st) == 0;
			}
			//获取⽂件所在⽬录
			static std::string GetPath(const std::string& pathname)
			{
				if (pathname.empty())return ".";
				size_t lo_pos = pathname.find_last_of("/\\");
				if (lo_pos == std::string::npos)return ".";
				return pathname.substr(0, lo_pos + 1);
			}
			//获取⽂件
			static std::string GetName(const std::string& pathname)
			{
				if (pathname.empty())return "error";
				size_t lo_pos = pathname.find_last_of("/\\");
				if (lo_pos == std::string::npos)return "error";
				return pathname.substr(lo_pos + 1, pathname.size());
			}
			//创建⽬录 directory 目录
			static void CreateDirectory(const std::string& path)
			{
				if (path.empty())return;
				if (Exists(path))return;
				try {
					fs::create_directories(path);// 自动递归创建,只能创建目录，不能创建文件
				}
				catch (const fs::filesystem_error& e) {
					std::cerr << "错误: " << e.what()
						<< "\n路径: " << e.path1()
						<< "\n错误码: " << e.code() << std::endl;
				}
			}
		};
	}
}

